#ifndef __BUOLA_GUI_X11_CX11SESSION_H__
#define __BUOLA_GUI_X11_CX11SESSION_H__

#include <buola/gui/x11/auto.h>
#include <buola/io/cfdstream.h>
#include <X11/SM/SMlib.h>

namespace buola { namespace gui { namespace x11 {

///////////////////////////////////////////////////////////////////////////
///////////////////////////                            ////////////////////
//////////////////////////          Structs          //////////////////////
///////////////////////////                          //////////////////////
///////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////
////////////////////////                         //////////////////////////
////////////////////////    Class CX11Session  ////////////////////////////
///////////////////////                         ///////////////////////////
///////////////////////////////////////////////////////////////////////////

class CX11Session : public UUncopiable,public io::DStreamActivity
{
public:
////////////////////////////////
// constructor and destructor
//
    CX11Session(CToolkit*);
    virtual ~CX11Session();

public:
////////////////////////////////////////////////////////////////
////////////////////////// interface ///////////////////////////
////////////////////////////////////////////////////////////////
    void Start();
    void Finish();

private:
////////////////////////////////////////
/////////////// internal ///////////////
////////////////////////////////////////
    void OnStreamCanRead(io::CFDStream*) override;
    void SMReset();

    void SMSetProperty(const char*,const std::string&);
    void SMSetListProperty(const char*,const std::vector<std::string>&);

    void SMSaveYourself(int,bool,int,bool);
    void SMShutdownCancelled();
    void SMSaveComplete();
    void SMInteract();
    void SMSaveYourselfPhase2();

////////////////////////////////////////
////////////// callbacks ///////////////
////////////////////////////////////////
    static void SMSaveYourselfCallback(SmcConn,SmPointer,int,Bool,int,Bool);
    static void SMDieCallback(SmcConn,SmPointer);
    static void SMShutdownCancelledCallback(SmcConn,SmPointer);
    static void SMSaveCompleteCallback(SmcConn,SmPointer);
    static void SMInteractCallback(SmcConn,SmPointer);
    static void SMSaveYourselfPhase2Callback(SmcConn,SmPointer);
////////////////////////////////////
/////////////// data ///////////////
////////////////////////////////////

protected:
    CToolkit *mToolkit;

    std::vector<std::string> mSMDiscard;
    std::vector<std::string> mSMRestart;
    int mSMRestartHint;
    std::string mSMID;

    SmcConn mSMConn;

    bool mSMWaitingInteraction;
    bool mSMInteracting;
    bool mSMActive;
    bool mSMWantPhase2;
    bool mSMInPhase2;
    bool mSMInShutdown;
    bool mSMNoUserInput;
    int mSMInteractStyle;
    int mSMSaveType;
    bool mSMFast;

    io::PFDStream mSMListener;
};

/*namespace x11*/ } /*namespace gui*/ } /*namespace buola*/ }

#endif
